package service.clazz.strategy;

import entity.table.TableDto;
import entity.table.TableFileDto;
import entity.table.TableInfoDto;
import enums.table.ClazzTypeEnum;
import enums.table.InitImportEnum;
import service.clazz.interfaces.ClazzStrategy;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 实体类
 */
public class ClazzEntityStrategy extends ClazzStrategy {

    @Override
    public TableFileDto enerateStrategy(List<TableDto> list, TableInfoDto table) {
        TableFileDto tableFileDto = new TableFileDto();
        tableFileDto.setFileName(table.getTableNameCamel(ClazzTypeEnum.Entity)+".java");
        tableFileDto.setContext(this.bringClazz(list, table));
        return tableFileDto;
    }

    /**
     * 生成类
     */
    public String bringClazz(List<TableDto> list, TableInfoDto table) {
        StringBuilder str = new StringBuilder();
        // 类路径
        str.append(super.bringPackage(table.getEntityPackaging()));
        // 类引用
        str.append(super.bringImport(InitImportEnum.initEntityList()));
        // 类内容
        str.append(super.bringBodyBean(ClazzTypeEnum.Entity, table.getTableNameCamel(), list));
        // 输出
        return str.toString();
    }

    // 生成导入（import）
    /*public String generateImport(List<TableDto> list) {
        Map<String, TableTypeEnum> temp = new HashMap<>();
        StringBuilder str = new StringBuilder("\n");

        for (int i=0; i<list.size(); i++) {
            TableDto tableDto = list.get(i);
            //
            TableTypeEnum tableTypeEnum = TableTypeEnum.getEnumByDataType(tableDto.getDataType());
            if (tableTypeEnum == null) {
                continue;
            }
            String javaType = tableTypeEnum.getJavaType();
            if (temp.get(javaType) != null) {
                continue;
            }
            temp.put(javaType, tableTypeEnum);
            // 生成 import
            str.append(ClazzConstact.IMPORT)
                    .append(" ")
                    .append(javaType)
                    .append(";\n");
        }
        str.append("import java.io.Serializable;\n");
        return str.toString();
    }*/

    // 生成私有属性、注释
//    public String generatePrivateProperty(List<TableDto> list) {
//        StringBuilder str = new StringBuilder();
//
//        for (TableDto tableDto : list) {
//            TableTypeEnum tableTypeEnum = TableTypeEnum.getEnumByDataType(tableDto.getDataType());
//            if (tableTypeEnum == null) {
//                continue;
//            }
//            // 生成 注释
//            str.append("\t\n\t/* \n")
//                    .append("\t * ")
//                    .append(tableDto.getColumnComment())
//                    .append("\t\n")
//                    .append("\t */\n");
//            // 生成 私有属性
//            str.append("\t")
//                    .append(ClazzConstact.PRIVSTE)
//                    .append(" ")
//                    .append(tableTypeEnum.getClazz())
//                    .append(" ")
//                    .append(tableDto.getLowerCamel())
//                    .append(";\n");
//        }
//        return str.toString();
//    }

    // 生成 set get 方法
    /*public String generateSetterAndGetter(List<TableDto> list) {
        StringBuilder str = new StringBuilder("\n");

        for (TableDto tableDto : list) {
            TableTypeEnum tableTypeEnum = TableTypeEnum.getEnumByDataType(tableDto.getDataType());
            if (tableTypeEnum == null) {
                continue;
            }
            String lowerCamel = tableDto.getLowerCamel();
            // 生成 setter
            str.append("\t\n\t").append(ClazzConstact.PUBLIC).append(" ").append(ClazzConstact.VOID).append(" ")
                    .append(tableDto.getSetterName())
                    .append("(").append(tableTypeEnum.getClazz()).append(" ").append(lowerCamel).append(") {\n")
                    .append("\t\t").append("this.").append(lowerCamel).append(" = ").append(lowerCamel) .append(";\t\n")
                    .append("\t}\n");
            // 生成 getter
            str.append("\t\n\t").append(ClazzConstact.PUBLIC).append(" ").append(tableTypeEnum.getClazz()).append(" ")
                    .append(tableDto.getGetterName()).append("() {\n")
                    .append("\t\t").append("return ").append(lowerCamel) .append(";\t\n")
                    .append("\t}\n");
        }
        return str.toString();
    }

    // 生成 toString
    public String generateToString(List<TableDto> list, TableInfoDto tableInfoDto) {
        StringBuilder str = new StringBuilder("\n");
        str.append("\t@Override\n")
                .append("\tpublic String toString() {\n")
                .append("\t\treturn \"").append(tableInfoDto.getTableNameCamel()).append(" { \" + \n");

        for (int i=0; i<list.size(); i++) {
            TableDto tableDto = list.get(i);
            TableTypeEnum tableTypeEnum = TableTypeEnum.getEnumByDataType(tableDto.getDataType());
            if (tableTypeEnum == null) {
                continue;
            }
            String lowerCamel = tableDto.getLowerCamel();

            str.append("\t\t\t\"").append(i == 0 ? "" : ", ").append(lowerCamel).append(" = ");

            if ("String".equals(tableTypeEnum.getClazz())) {
                str.append("'\" + ").append(lowerCamel).append(" + '\\'' + \n");
            } else {
                str.append("\" + ").append(lowerCamel).append(" + \n");
            }
        }
        str.append("\t\t\t\"}\";\n");
        str.append("\t}\n");
        return str.toString();
    }*/
}
